package main

import (
	"fmt"
	"sync"
)

// LogEntry 一个独立的日志副本
type LogEntry struct {
	Level   string
	Message string
}

// Logger 管理日志并负责写入
type Logger struct {
	entries chan *LogEntry // 用一个通道传递日志
	wg      sync.WaitGroup
}

// NewLogger 创建日志处理器
func NewLogger(bufferSize int) *Logger {
	logger := &Logger{
		entries: make(chan *LogEntry, bufferSize),
	}
	logger.wg.Add(1)
	go logger.process() // 启动后台处理协程
	return logger
}

func (l *Logger) Log(level, message string) {
	entry := &LogEntry{Level: level, Message: message} // 日志副本
	l.entries <- entry                                 // 无锁发送（通道缓存区没满不会用到锁）
}

func (l *Logger) process() {
	defer l.wg.Done()
	for entry := range l.entries {
		// 实际处理日志过程 比如写入文件
		fmt.Printf("[%s] %s\n", entry.Level, entry.Message)
	}
}

func (l *Logger) Close() {
	close(l.entries)
	l.wg.Wait()
}

func main() {
	logger := NewLogger(100)
	defer logger.Close()

	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			logger.Log("INFO", fmt.Sprintf("Worker %d: Task completed", id))
		}(i)
	}
	wg.Wait()
}
